import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import '../../../common/services/index.dart';
import '../../../common/models/index.dart';
import '../../../common/routers/index.dart';

/// 登录页面控制器
/// 负责登录页面的状态管理、表单验证和登录业务逻辑
class LoginController extends GetxController {
  // 1. 静态常量（类级别）
  static const String tag = 'LoginController';
  static const int maxRetryCount = 3;
  static const Duration animationDuration = Duration(milliseconds: 800);
  static const Duration loadingDelay = Duration(milliseconds: 1000);
  
  // 2. 实例常量
  final String pageTitle = '登录';
  final String welcomeText = '中国音乐学院在线评审';
  final String subtitleText = '请输入手机号和验证码登录系统';
  
  // 3. 响应式变量（Rx系列）
  // 基础类型 - 使用.obs写法（推荐95%场景）
  var isLoading = false.obs;                    // RxBool - 加载状态
  var hasError = false.obs;                    // RxBool - 错误状态
  var phone = ''.obs;                          // RxString - 手机号
  var captcha = ''.obs;                        // RxString - 验证码
  var errorMessage = ''.obs;                   // RxString - 错误信息
  var loginAttempts = 0.obs;                   // RxInt - 登录尝试次数
  var logoScale = 0.8.obs;                     // RxDouble - Logo缩放动画
  var formOpacity = 0.0.obs;                   // RxDouble - 表单透明度动画
  var countdown = 0.obs;                       // RxInt - 验证码倒计时
  var isSendingCode = false.obs;              // RxBool - 发送验证码中
  
  // 集合类型 - 使用.obs写法
  var validationErrors = <String, String>{}.obs; // RxMap - 表单验证错误
  
  // 可空类型 - 特殊场景使用
  var lastLoginTime = RxnString();             // 可空字符串 - 上次登录时间
  
  // 4. 普通变量（非响应式）
  bool _isInitialized = false;
  String _savedPhone = '';
  Timer? _animationTimer;
  Timer? _formTimer;
  Timer? _countdownTimer;
  int _retryCount = 0;
  
  // 5. 控制器和服务依赖
  final TextEditingController phoneController = TextEditingController();
  final TextEditingController captchaController = TextEditingController();
  final GlobalKey<FormState> formKey = GlobalKey<FormState>();
  final FocusNode phoneFocusNode = FocusNode();
  final FocusNode captchaFocusNode = FocusNode();
  
  // 服务依赖
  UserService get _userService => Get.find<UserService>();
  StorageService get _storageService => Get.find<StorageService>();
  
  // 6. 构造函数
  LoginController() {
    debugPrint('$tag: Constructor');
    
    // 确保动画变量的安全初始值
    logoScale.value = 0.8;
    formOpacity.value = 0.0;
  }

  // 7. 私有初始化方法
  void _initData() {
    debugPrint('$tag: 初始化登录页面数据');
    
    // 设置状态栏样式
    _setStatusBarStyle();
    
    // 加载保存的登录信息
    _loadSavedCredentials();
    
    // 启动入场动画
    _startEntranceAnimation();
    
    _isInitialized = true;
    update(["login"]);
  }
  
  /// 设置状态栏样式
  void _setStatusBarStyle() {
    SystemChrome.setSystemUIOverlayStyle(
      const SystemUiOverlayStyle(
        statusBarColor: Colors.transparent,
        statusBarIconBrightness: Brightness.dark,
        statusBarBrightness: Brightness.light,
        systemNavigationBarColor: Colors.white,
        systemNavigationBarIconBrightness: Brightness.dark,
      ),
    );
    debugPrint('$tag: 状态栏样式设置完成');
  }
  
  /// 加载保存的登录凭据
  void _loadSavedCredentials() {
    try {
      // 不再自动填充手机号，用户需要每次手动输入
      // _savedPhone = _storageService.getString('saved_phone') ?? '';
      
      // if (_savedPhone.isNotEmpty) {
      //   phone.value = _savedPhone;
      //   phoneController.text = _savedPhone;
      //   
      //   debugPrint('$tag: 已加载保存的手机号');
      // }
      
      // 获取上次登录时间
      lastLoginTime.value = _storageService.getString('last_login_time');
      
      debugPrint('$tag: 已禁用自动填充手机号功能');
    } catch (e) {
      debugPrint('$tag: 加载保存的登录信息失败: $e');
    }
  }
  
  /// 启动入场动画
  void _startEntranceAnimation() {
    // Logo缩放动画
    logoScale.value = 0.8;
    formOpacity.value = 0.0;
    
    _animationTimer = Timer.periodic(const Duration(milliseconds: 50), (timer) {
      if (logoScale.value < 1.0) {
        logoScale.value = (logoScale.value + 0.02).clamp(0.0, 1.0);
      } else {
        logoScale.value = 1.0; // 确保最终值为1.0
        timer.cancel();
        // Logo动画完成后开始表单动画
        _startFormAnimation();
      }
      update(["login"]);
    });
  }
  
  /// 启动表单显示动画
  void _startFormAnimation() {
    _formTimer = Timer.periodic(const Duration(milliseconds: 30), (timer) {
      if (formOpacity.value < 1.0) {
        formOpacity.value = (formOpacity.value + 0.05).clamp(0.0, 1.0);
        update(["login"]);
      } else {
        formOpacity.value = 1.0; // 确保最终值为1.0
        timer.cancel();
        _formTimer = null;
      }
    });
  }

  // 8. 业务方法
  
  /// 手机号输入变化处理
  void onPhoneChanged(String value) {
    phone.value = value;
    _clearFieldError('phone');
    update(["login"]);
  }
  
  /// 验证码输入变化处理
  void onCaptchaChanged(String value) {
    captcha.value = value;
    _clearFieldError('captcha');
    update(["login"]);
  }
  
  /// 发送验证码
  Future<void> sendVerificationCode() async {
    // 验证手机号
    if (phone.value.trim().isEmpty) {
      EasyLoading.showError('请输入手机号');
      return;
    }
    
    if (!_isValidPhone(phone.value.trim())) {
      EasyLoading.showError('请输入有效的手机号');
      return;
    }
    
    // 如果正在倒计时，不允许再次发送
    if (countdown.value > 0) {
      return;
    }
    
    try {
      isSendingCode.value = true;
      update(["login"]);
      
      debugPrint('$tag: 发送验证码到: ${phone.value}');
      
      // 调用UserService发送验证码
      await _userService.sendSMS(phone.value.trim());
      
      debugPrint('$tag: 验证码发送成功');
      
      // 显示成功提示
      EasyLoading.showSuccess(
        '验证码已发送',
        duration: const Duration(seconds: 2),
      );
      
      // 开始倒计时
      _startCountdown();
      
    } catch (e) {
      debugPrint('$tag: 发送验证码失败: $e');
      
      // 提取错误信息
      String errorMsg = '验证码发送失败';
      if (e.toString().contains('Exception:')) {
        errorMsg = e.toString().replaceFirst('Exception: ', '');
      }
      
      EasyLoading.showError(errorMsg);
      
    } finally {
      isSendingCode.value = false;
      update(["login"]);
    }
  }
  
  /// 开始倒计时
  void _startCountdown() {
    countdown.value = 60; // 60秒倒计时
    _countdownTimer?.cancel();
    
    _countdownTimer = Timer.periodic(const Duration(seconds: 1), (timer) {
      if (countdown.value > 0) {
        countdown.value--;
        update(["login"]);
      } else {
        timer.cancel();
        _countdownTimer = null;
      }
    });
  }
  
  /// 验证手机号格式
  bool _isValidPhone(String phone) {
    // 简单的中国手机号验证：11位数字，1开头
    final phoneRegex = RegExp(r'^1[3-9]\d{9}$');
    return phoneRegex.hasMatch(phone);
  }
  
  /// 登录按钮点击处理
  void onLoginTap() async {
    if (!_isInitialized) {
      debugPrint('$tag: 控制器未初始化，忽略登录操作');
      return;
    }
    
    debugPrint('$tag: 开始登录流程');
    
    // 清除焦点
    phoneFocusNode.unfocus();
    captchaFocusNode.unfocus();
    
    // 表单验证
    if (!_validateForm()) {
      debugPrint('$tag: 表单验证失败');
      return;
    }
    
    await _performLogin();
  }
  
  /// 执行登录逻辑
  Future<void> _performLogin() async {
    try {
      isLoading.value = true;
      hasError.value = false;
      errorMessage.value = '';
      _retryCount = 0;
      update(["login"]);
      
      // 显示 Loading - 登录中
      EasyLoading.show(
        status: '登录中...',
        maskType: EasyLoadingMaskType.black,
      );
      
      debugPrint('$tag: 调用用户服务登录API');
      
      // 调用用户服务登录
      final result = await _userService.login(
        phone: phone.value.trim(),
        captcha: captcha.value.trim(),
      );
      
      if (result.isSuccess) {
        debugPrint('$tag: 登录成功');
        
        // 保存手机号
        await _saveCredentialsIfNeeded();
        
        // 更新登录尝试次数
        loginAttempts.value++;
        
        // 登录成功后获取专家信息
        await _fetchUserInfo();
        
        // 关闭 Loading
        EasyLoading.dismiss();
        
        // 显示成功提示 - 使用 EasyLoading
        EasyLoading.showSuccess(
          '登录成功！',
          duration: const Duration(milliseconds: 1500),
          maskType: EasyLoadingMaskType.clear,
        );
        
        // 延迟跳转，让用户看到成功提示
        await Future.delayed(const Duration(milliseconds: 1500));
        
        // 跳转到主页面 - 使用offAllNamed清除所有路由历史
        Get.offAllNamed(RouteNames.systemMain);
        
      } else {
        // 关闭 Loading
        EasyLoading.dismiss();
        _handleLoginFailure(result.errorMessage ?? '登录失败，请重试');
      }
      
    } catch (e) {
      debugPrint('$tag: 登录异常: $e');
      // 关闭 Loading
      EasyLoading.dismiss();
      _handleLoginFailure('网络连接异常，请检查网络后重试');
    } finally {
      isLoading.value = false;
      update(["login"]);
    }
  }
  
  /// 处理登录失败
  void _handleLoginFailure(String message) {
    hasError.value = true;
    errorMessage.value = message;
    
    // 增加重试次数
    _retryCount++;
    loginAttempts.value++;
    
    // 显示错误提示 - 使用 EasyLoading
    EasyLoading.showError(
      message,
      duration: const Duration(seconds: 3),
      maskType: EasyLoadingMaskType.clear,
    );
    
    // 如果尝试次数过多，清空验证码
    if (_retryCount >= maxRetryCount) {
      captcha.value = '';
      captchaController.clear();
      debugPrint('$tag: 达到最大重试次数，清空验证码');
    }
    
    update(["login"]);
  }
  
  /// 表单验证
  bool _validateForm() {
    validationErrors.clear();
    
    // 验证手机号
    if (phone.value.trim().isEmpty) {
      validationErrors['phone'] = '请输入手机号';
    } else if (!_isValidPhone(phone.value.trim())) {
      validationErrors['phone'] = '请输入有效的手机号';
    }
    
    // 验证验证码
    if (captcha.value.trim().isEmpty) {
      validationErrors['captcha'] = '请输入验证码';
    } else if (captcha.value.trim().length < 4) {
      validationErrors['captcha'] = '验证码至少4位';
    }
    
    final isValid = validationErrors.isEmpty;
    
    if (!isValid) {
      hasError.value = true;
      errorMessage.value = validationErrors.values.first;
    }
    
    update(["login"]);
    return isValid;
  }
  
  /// 清除字段错误
  void _clearFieldError(String fieldName) {
    if (validationErrors.containsKey(fieldName)) {
      validationErrors.remove(fieldName);
      if (validationErrors.isEmpty) {
        hasError.value = false;
        errorMessage.value = '';
      }
    }
  }
  
  /// 保存手机号（如果需要）
  Future<void> _saveCredentialsIfNeeded() async {
    try {
      // 保存手机号
      await _storageService.setString('saved_phone', phone.value);
      debugPrint('$tag: 已保存手机号');
      
      // 保存登录时间
      await _storageService.setString('last_login_time', DateTime.now().toIso8601String());
      
    } catch (e) {
      debugPrint('$tag: 保存手机号失败: $e');
    }
  }
  
  /// 获取专家信息
  /// 
  /// 通过UserService获取专家信息，符合分层架构原则
  Future<void> _fetchUserInfo() async {
    try {
      debugPrint('$tag: 开始获取专家信息');
      
      // 调用UserService获取专家个人资料（会自动保存到本地）
      final expertInfo = await _userService.getExpertInfo();
      
      debugPrint('$tag: 专家信息获取成功');
      debugPrint('$tag: 专家姓名: ${expertInfo.name}');
      debugPrint('$tag: 专家机构: ${expertInfo.corpName ?? "无"}');
      debugPrint('$tag: 专家职务: ${expertInfo.officialCapacity ?? "无"}');
      
    } catch (e) {
      debugPrint('$tag: 获取专家信息异常: $e');
      
      // 异常不影响登录流程，但要记录日志
      EasyLoading.showInfo(
        '专家信息获取异常\n请稍后刷新',
        duration: const Duration(seconds: 2),
        maskType: EasyLoadingMaskType.clear,
      );
    }
  }
  
  /// 重置登录状态
  void resetLoginState() {
    debugPrint('$tag: 重置登录状态');
    
    isLoading.value = false;
    hasError.value = false;
    errorMessage.value = '';
    validationErrors.clear();
    loginAttempts.value = 0;
    _retryCount = 0;
    countdown.value = 0;
    
    update(["login"]);
  }

  // 9. 生命周期方法
  @override
  void onInit() {
    super.onInit();
    debugPrint('$tag: onInit');
    
    // 设置文本控制器监听
    phoneController.addListener(() => onPhoneChanged(phoneController.text));
    captchaController.addListener(() => onCaptchaChanged(captchaController.text));
  }

  @override
  void onReady() {
    super.onReady();
    debugPrint('$tag: onReady');
    _initData();
  }

  @override
  void onClose() {
    debugPrint('$tag: onClose');
    
    // 清理Timer资源
    _animationTimer?.cancel();
    _formTimer?.cancel();
    _countdownTimer?.cancel();
    
    // 清理文本控制器
    phoneController.dispose();
    captchaController.dispose();
    
    // 清理焦点节点
    phoneFocusNode.dispose();
    captchaFocusNode.dispose();
    
    // 重置状态栏（可选，通常由下一个页面设置）
    // _resetStatusBarStyle();
    
    super.onClose();
  }
  
}
